1. Field
The disclosed embodiments relate to function overloading in programming languages. More specifically, the disclosed embodiments relate to techniques for computing dispatch predicates for applicability of overloaded functions to function calls associated with the overloaded functions in programming languages with generic type hierarchies that lack contravariance.
2. Related Art
Programming languages may support function and/or method overloading, in which multiple methods within an object and/or functions declared within the same scope share the same name. Such name sharing may facilitate the identification and/or grouping of functions and/or methods that perform conceptually similar tasks but operate on different types and/or amounts of data.
During invocation of an overloaded function and/or method, a programming language may dispatch a function call to the function and/or method by selecting an implementation of the function and/or method based on the types and/or number of arguments from the function call. For example, the programming language may select the most specific implementation from a set of candidate implementations of the function and/or method that are accessible and applicable. Moreover, the programming language may use multiple dispatch, which resolves the function call based on the runtime types of the function call's arguments.
However, an overloaded function and/or method may include one or more generic functions containing parameterized types. Because the generic functions may accept parameters from the same and/or overlapping sets of types, the generic functions may complicate the determination of specificity and/or applicability during dispatch of a function call to the function and/or method. The function call may also include generic type parameters, which must also be inferred for correct dispatching of the function call. In turn, the additional complexity and/or computation associated with generic functions and/or generic type parameters in overloaded functions may increase the overhead associated with runtime dispatch of function calls to the overloaded functions.
Hence, what is needed is a mechanism for performing multiple dispatch of function calls associated with generic type hierarchies and/or type inference on generic type parameters associated with the function calls.